/* --------------------------- (C) COPYRIGHT 2020 Fortiortech ShenZhen -----------------------------
    File Name      : LIN.h
    Author         : Fortiortech  Appliction Team
    Version        : V1.0
    Date           : 2020-07-28
    Description    : This file contains LIN parameter used for Motor Control.
----------------------------------------------------------------------------------------------------
                                       All Rights Reserved
------------------------------------------------------------------------------------------------- */

/* Define to prevent recursive inclusion -------------------------------------------------------- */
#ifndef __LIN_H__
#define __LIN_H__
#include "FU68xx_4_Type.h"
/*------LIN选择的是DMA0还是DMA1------*/
#define     LIN_DMA_Pipe            1                               //默认为DMA1

/*------LIN选择是否开启中断以及中断优先级选择------*/
#define     LIN_IRQ_L1              0                               //1级
#define     LIN_IRQ_L2              0x10                            //2级
#define     LIN_IRQ_L3              0x20                            //3级
#define     LIN_IRQ_L4              0x30                            //4级

#define     CHKMOD_Standard         CHKMOD                          //标准校验
#define     CHKMOD_Enhanced         0                               //增强校验

#define     LINRW_R                 0                               //接收
#define     LINRW_W                 LINRW                           //发送

#define     AUTOSIZE_N              0                               //不使能
#define     AUTOSIZE_E              AUTOSIZE                        //使能

#define     LINEN_N                 0                               //不使能
#define     LINEN_E                 LINEN                           //使能

#define     ClrTransCompIRQ         ClrBit(LIN_SR , LINDONE)        //清除传输完成产生中断的标志位
#define     Clr_LIN_Error_IRQ       ClrBit(LIN_CSR , CLRERR)        //清除检测到错误产生中断的标志位

#define     LIN_Into_Sleep          SetBit(LIN_CSR , LINSLP)        //使LIN进入睡眠
#define     LIN_Quit_Sleep          ClrBit(LIN_CSR , LINSLP)        //使LIN退出睡眠
#define     LIN_Awakening           SetBit(LIN_CSR , LINWAKEUP)     //发送唤醒信号
#define     Clr_LIN_Awakening_IRQ   ClrBit(LIN_CSR , LINWAKEUP)     //清除收到唤醒信号产生中断的标志位

#define     ClrBusIRQ               ClrBit(LIN_SR , LINIDLE)        //清除总线超过4s产生中断的标志位

#define     LIN_Transfer_Stop       SetBit(LIN_CSR , LINSTOP)       //停止传送

#define     Clr_LINREQ_IRQ          ClrBit(LIN_SR , LINREQ)         //清除收到帧头产生中断的标志位

#define     LIN_Signal_Response     SetBit(LIN_CSR , LINACK)        //应答帧头，该位置 1 前必须将校验模式, 读写模式,数据, 数据长度准备好

#define 	False                   0
#define 	True                    1


typedef struct
{
    uint8 Falg;        //安全验证标志位
    uint16 Time;       //安全验证时间 2s没有数据 退出安全验证
} Safety_Verification; //安全验证


typedef struct
{
    uint8 NAD;  //电机的机型号 0X60~0X6B
    uint8 PCI;  //有效数据长度
    uint8 SID;  //服务ID
    uint8 DIDH; //数据ID
    uint8 DIDL; //数据ID
    uint8 DATA[12];
    uint8 Pack;  //回复包的数量
    uint8 Reply; //回复ID
} LIN_Diagnosis;



extern Safety_Verification Safety; //安全验证


typedef uint8 eType_LIN_IRQ;
typedef uint8 eType_LIN_CHKMOD;
typedef uint8 eType_LIN_LINRW;
typedef uint8 eType_LIN_AUTOSIZE;
typedef uint8 eType_LIN_LINEN;

extern uint8 xdata ucaLinBuff[8];

/*------LIN中断使能&中断等级设置------*/
extern void SetIRQ_LIN(ebool eIRQ, eType_LIN_IRQ eIP);              //具体设置函数

/*------LIN的通讯校验模式------*/
extern void Verify_Mode_Configuration(eType_LIN_CHKMOD eCHKMOD);    //具体设置函数

/*------LIN选择是发送还是接收------*/
extern void Choose_LINRW(eType_LIN_LINRW eLINRW);                   //具体设置函数

/*------LIN选择是否使能根据ID自动设置数据长度------*/
extern void Using_AUTOSIZE(eType_LIN_AUTOSIZE eAUTOSIZE);           //具体设置函数

/*------LIN总线功能的使能------*/
extern void LINEN_Control(eType_LIN_LINEN eLINEN);                  //具体设置函数
extern ebool LIN_Enable_Check(void);                                //检测LIN总线是否已经被使能

/*------LIN总线初始化------*/
extern void LIN_Init(void);                                         //LIN初始化

/*------LIN收到帧头触发中断------*/
extern ebool LINREQ_Check(void);                                    //检测是否收到帧头
extern void Perform_LINREQ(void);                                   //触发LINREQ中断执行的函数
extern void set_LIN_Data_Length(uint8 eLength);                     //设置LIN总线发送接收数据帧长度
extern void Sleep_Order_2Type_ID_0X1F(void);                        //从机增强校验接收模式接受到睡眠ID和指令执行的睡眠程序

/*------LIN传输完成------*/
extern ebool Transfer_Complete_Check(void);                         //检验是否传输完成

/*------LIN传输错误处理------*/
extern ebool LIN_Error_Check(void);                                 //检测是否出现错误
extern ebool Sync_Error_Check(void);                                //检验是否发生同步错误
extern ebool Data_Error_Check(void);                                //检验是否发生数据检验错误
extern ebool ID_Error_Check(void);                                  //检验是否发生ID校验错误
extern void LIN_Error_Handing(void);                                //处理错误的函数

/*------LIN是否空闲4s------*/
extern ebool Bus_Time_Check(void);                                  //检验总线是否空闲超过4s

/*------LIN睡眠与唤醒------*/
extern ebool LIN_Sleep_Check(void);                                 //检测是否处于睡眠状态
extern ebool LIN_Wakeup_Signal_Check(void);                         //检测是否接收到唤醒信号

extern ebool ABORT_Error_Check(void);                               //检验是否发生传输中断
extern ebool Communication_Status_Check(void);                      //通讯状态检测
extern void LIN_Wakeup_Master(void);                                //唤醒主机或者其它从机的函数
extern uint8 get_LINID(void);                                       //获取LIN的ID
extern uint8 get_LIN_Data_Length(void);                             //获取LIN的接收发送数据帧长度
extern uint16 get_LIN_BAUD(void);                                   //获取LIN的波特率

extern void Diagnosis(uint8 *Buff);


#endif


